/***********************************************************************************
 * 文件名： mcu.h
 * 作者： 刘言
 * 版本： 1
 * 说明：
 * 		MCU 所有的驱动顶层文件，使用MCU驱动只用包含这一个文件即可。
 * 修改记录：
 * 	2020/8/18: 初版。 刘言。
***********************************************************************************/
#ifndef _MCU_H_
#define _MCU_H_

#ifdef __cplusplus
 extern "C" {
#endif

#include "HC32_LyLib.h"


///////////////////////////// 参数检查

#if (HC32_MCU_SERIES == HC32F005)
	#if (F_HSI > 24)
		#error "HC32F005系列F_HSI最大24MHz."
	#elif (F_HSI < 4)
		#error "HC32F005系列F_HSI最小4MHz."
	#endif
#endif

///////////////////////////// 参数计算

#if (CLOCK_SOURCE==0)	//使用内部高速RC
	#define F_SYS	    F_HSI    	
#else					//使用外部晶振
	#define F_SYS		F_HSE	
#endif
#if (F_SYS == 0)
	#error "F_SYS不可以为0。"
#else
	#if (MCU_HCLK_PRS == 0)
		#define F_HCLK		F_SYS
	#elif (MCU_HCLK_PRS == 1)
		#define F_HCLK		(F_SYS/2)
	#elif (MCU_HCLK_PRS == 2)
		#define F_HCLK		(F_SYS/4)
	#elif (MCU_HCLK_PRS == 3)
		#define F_HCLK		(F_SYS/8)
	#elif (MCU_HCLK_PRS == 4)
		#define F_HCLK		(F_SYS/16)
	#elif (MCU_HCLK_PRS == 5)
		#define F_HCLK		(F_SYS/32)
	#elif (MCU_HCLK_PRS == 6)
		#define F_HCLK		(F_SYS/64)
	#elif (MCU_HCLK_PRS == 7)
		#define F_HCLK		(F_SYS/128)
	#endif
	#if (MCU_PCLK_PRS == 0)
		#define F_PCLK		F_HCLK
	#elif (MCU_PCLK_PRS == 1)
		#define F_PCLK		(F_HCLK/2)
	#elif (MCU_PCLK_PRS == 2)
		#define F_PCLK		(F_HCLK/4)
	#elif (MCU_PCLK_PRS == 3)
		#define F_PCLK		(F_HCLK/8)
	#endif
	#define F_CPU		  	F_HCLK
#endif

///////////////////////////// 提供的API

void SystemDeInit(void);

// 内部RC在几个标准频率的校准值
#define RCH_TRIM_24MHZ		*((volatile uint16_t *)0x00100C00ul)
#define RCH_TRIM_22_12MHZ	*((volatile uint16_t *)0x00100C02ul)
#define RCH_TRIM_16MHZ		*((volatile uint16_t *)0x00100C04ul)
#define RCH_TRIM_8MHZ		*((volatile uint16_t *)0x00100C06ul)
#define RCH_TRIM_4MHZ		*((volatile uint16_t *)0x00100C08ul)
// 设置RCH（HSI）频率校准值，注意前后2次的差值不能超过70！设置有死机风险！
// 可用于程序运行中调节RCH（HSI）频率
#define SystemSetRchTrim(a)	M0P_SYSCTRL->RCH_CR = a;


#define UID_ADDR	0x00100E74
#define UID_LEN		10
#define Mcu_GetUid()			(u8 *)UID_ADDR
#define Mcu_GetUidLength()		UID_LEN


// 提供给 Polsys 调用
#define Mcu_Init()                                    // ARM内核的MCU一般在 SystemInit() 函数中初始化时钟
#define Mcu_TickStart() SysTick_Config(SYSTICK_VALUE) // 启动系统节拍计时器
#define Mcu_EnableInt() __enable_irq()                // 开全局中断
#define Mcu_DisableInt() __disable_irq()              // 关全局中断


///////////////////////////// 外设驱动

#include "hc32_adv_timer.h"
#include "hc32_base_timer.h"
#include "hc32_general_timer.h"
#include "hc32_base_uart.h"
#include "hc32_general_uart.h"
#include "mcu_flash.h"
#include "mcu_power.h"
#include "mcu_delay.h"
#include "mcu_adc.h"
#include "mcu_aes.h"
#include "mcu_crc.h"
#include "mcu_temp_sensor.h"
#include "mcu_pca.h"
#include "mcu_wdt.h"

#ifdef __cplusplus
}
#endif

#endif

